home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-13
/
unity331.zip
/
FERROR.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1991-09-19
|
8KB
|
280 lines
Program FindPasOrAsmError;
Uses
Dos;
{ Error message filter. This version supports the following: }
{ }
{ Turbo Pascal }
{ Turbo Assembler }
{ Turbo C++ }
{ Turbo Link }
{ Microsoft Macro Assembler 5.1 }
{ QuikByte Pascal & Linker }
{ and possibly all Microsoft command line compilers }
{ The output MUST go to the standard output device. If the CRT unit is }
{ used the output will go directly to the screen or through the BIOS, }
{ and not to the standard output. XP will not be able to locate the }
{ error messages if that occures. }
Var
Source : Text;
Line : String;
Index : Integer;
FileName : String;
LineNo : String;
Column : Integer;
Message : String;
Buffer : Array[1..1024] of Char;
Done : Boolean;
Function Trim(Line : String) : String;
Begin
While (Line[1] = ' ') AND (Length(Line) > 0) Do Delete(Line,1,1);
While Line[Length(Line)] = ' ' Do Dec(Line[0]);
Trim := Line;
End;
Procedure TurboPasFile;
Const
ErrorStr = 'Error';
Begin
Repeat
ReadLn(Source,Line);
Index := Pos(^M,Line);
While Index > 0 Do
Begin
Delete(Line,1,Index);
Index := Pos(^M,Line);
End;
Index := Pos(ErrorStr,Line);
Until (Index <> 0) OR Eof(Source);
If Index <> 0 THEN
BEGIN
Index := Pos('(',Line);
If (Index = 0) or (Index > Pos(ErrorStr,Line))
Then Writeln(', 0, 0, ',Line)
Else Begin
FileName := Copy(Line,1,Pred(Index));
Delete(Line,1,Index);
Index := Pos(')',Line);
LineNo := Copy(Line,1,Pred(Index));
Delete(Line,1,Index+2);
Message := Line;
ReadLn(Source,Line);
ReadLn(Source,Line);
Column := Pos('^',Line);
WriteLn(FileName,',',LineNo,',',Column,',',Message);
End;
END;
End;
Procedure TurboAsmFile;
Const
Errors : Array[1..3] of String[9] = ('**Error**','*Warning*','**Fatal**');
Var
Loop : Integer;
Temp : String;
Begin
While Not Eof(Source) Do
Begin
Repeat
ReadLn(Source,Line);
Index := Pos(^M,Line);
While Index > 0 Do
Begin
Delete(Line,1,Index);
Index := Pos(^M,Line);
End;
Loop := 1;
Repeat
Index := Pos(Errors[Loop],Line);
If Index = 0
Then Inc(Loop)
Else Begin
Temp := Copy(Line,1,Length(Errors[Loop]));
If Index > 1 Then Delete(Temp,1,Pred(Index));
Delete(Line,1,Succ(Length(Errors[Loop])));
Loop := 4;
End;
Until (Loop > 3) Or Eof(Source);
Until (Index <> 0) OR Eof(Source);
If Index <> 0 THEN
BEGIN
Index := Pos('(',Line);
If Index = 0
Then Begin
FileName := '';
LineNo := '0';
Column := 0;
Message := Trim(Line);
End
Else Begin
FileName := Copy(Line,1,Pred(Index));
Delete(Line,1,Index);
Index := Pos(')',Line);
LineNo := Copy(Line,1,Pred(Index));
Delete(Line,1,Succ(Index));
Message := Line;
Column := 0;
End;
WriteLn(FileName,',',LineNo,',',Column,',',Temp,' ',Message);
End;
END;
End;
Procedure QuickBytePascal;
Begin
Line := '';
While (Not Eof(Source)) AND (Pos('QBPERR.EXE',Line) = 0) Do ReadLn(Source,Line);
If Eof(Source) Then Halt;
While Not Eof(Source) Do
Begin
ReadLn(Source,LIne);
If Pos('):',Line) > 0 Then
Begin
Index := Pos('(',Line);
Message := Copy(Line,1,Pred(Index)) + ', ';
Delete(Line,1,Index);
Index := Pos(')',Line);
Message := Message + Copy(Line,1,Pred(Index)) + ', 1, ';
Delete(Line,1,Index + 2);
WriteLn(Message,Line);
End;
End;
End;
Procedure Microsoft;
Begin
While Not Eof(Source) Do
Begin
ReadLn(Source,Line);
If Pos('LINK :',Line) = 1
Then WriteLn(',0,0,',Line)
Else If Pos('):',Line) > 0 Then
Begin
Index := Pos('(',Line);
Message := Copy(Line,1,Pred(Index)) + ', ';
Delete(Line,1,Index);
Index := Pos(')',Line);
Message := Message + Copy(Line,1,Pred(Index)) + ', 1, ';
Delete(Line,1,Index + 2);
WriteLn(Message,Line);
End;
End;
End;
Procedure TurboLink;
Var
Temp : String;
Const
Errors : Array[1..3] of String[8] = ('Error:','Fatal:','Warning:');
Begin
While Not Eof(Source) Do
Begin
ReadLn(Source,Line);
Index := 0;
Repeat
Inc(Index);
Until (Pos(Errors[Index],Line) <> 0) Or (Index > 3);
If Index <= 3 Then WriteLn(' , 0, 0, ',Line);
End;
End;
Procedure TurboC_PlusPlus;
Const
MaxErrMsg = 2;
Errors : Array[1..MaxErrMsg] of String[7] = ('Error','Warning');
NewError: Array[1..MaxErrMsg] of String[9] = ('**Error**','*Warning*');
Var
Index, Loop : Integer;
Temp : String;
IsError : Boolean;
Begin
While Not Eof(Source) Do
Begin
Repeat
ReadLn(Source,Line);
If Pos('Turbo Link',Line) = 1 Then
Begin
TurboLink;
Exit;
End;
Index := Pos(' ',Line);
Temp := Copy(Line,1,Index-1);
IsError := False;
Loop := 1;
While (Not IsError) AND (Loop <= MaxErrMsg) Do
If Temp = Errors[Loop] Then
IsError := True
Else
Inc(Loop);
If IsError Then
Begin
Delete(Line,1,Index);
Line := Trim(Line);
Index := Pos(' ',Line);
If Index > 0 Then
Begin
Temp := Copy(Line,1,Pred(Index)) + ', ';
Delete(Line,1,Index);
Index := Pos(':',Line);
Temp := Temp + Copy(Line,1,Pred(Index)) + ', 0, ';
Delete(Line,1,Index);
Writeln(Temp,Trim(Line));
End;
End;
Until Eof(Source);
End;
End;
Begin
If ParamCount = 0 Then Halt;
Assign(Source,ParamStr(ParamCount));
SetTextBuf(Source,Buffer);
{$I-}
Reset(Source);
{$I-}
If IoResult <> 0 Then
Begin
WriteLn(', , , Error in FERROR when opening file!');
Halt(1);
End;
Repeat
Done := True;
ReadLn(Source,Line);
If Pos('Turbo Pascal',Line) <> 0 { Turbo Pascal }
Then TurboPasFile
Else If Pos('Turbo Assembler',Line) <> 0 { Turbo Assembler }
Then TurboAsmFile
Else If Pos('QuikByte Pascal',Line) <> 0 { Quick Byte Pascal }
Then QuickBytePascal
Else If Pos('Macro Assembler',Line) <> 0 { Microsoft MASM }
Then Microsoft
Else If Pos('Turbo C',Line) <> 0 { Turbo C/C++ }
Then TurboC_PlusPlus
Else If Pos('Turbo Link',Line) <> 0 { Turbo Link }
Then TurboLink
Else If Pos('Microsoft',Line) <> 0 { All Microsoft? }
Then Microsoft
Else Done := False;
Until Done or Eof(Source);
If Not Done Then WriteLn(', , , Unrecognized compiler output!');
If TextRec(Source).Mode = FmInput Then Close(Source);
End.